<?php
/**
 * Created by Phpstorm
 * @time : 2019/10/22 - 11:50
 * @author : xxl
 */

namespace app\common\controller;


use app\api\model\Passenger;
use app\api\model\UserModel;
use app\common\model\User;
use \app\api\model\StaffModel;
use Firebase\JWT\JWT;
use think\facade\Config;
use think\facade\Request;

//use think\Request;

class Auth
{
    /**
     * @var UserModel
     */
    protected $member;

    protected $config;

    /**
     * @var
     */
    protected $user_id;

    /**
     * @var  object 实例对象
     */
    protected static $instance;

    public function __construct()
    {
        if ($config = Config::get('auth.')){
            $this->config = $config;
        }
    }

    /**
     * @describe 初始化
     * @return Auth
     * @time : 2019/10/22 - 11:58
     * @author : xxl
     */
    public static function instance()
    {
        if (is_null(self::$instance)){
            self::$instance = new static();
        }

        return self::$instance;
    }

    /**
     * @describe  生产token
     * @param $user_id
     * @return string
     * @time : 2019/10/22 - 14:41
     * @author : xxl
     */
    public function token($user_id,$type = 0)
    {
        $key = \Config::get('config.jwt.jwt_key');  //这里是自定义的一个随机字串，应该写在config文件中的，解密时也会用，相当    于加密中常用的 盐  salt

        $token   = sha1($user_id . uniqid());

        $jwt = [
            "iss"=>"",  //签发者 可以为空
            "aud"=>"", //面象的用户，可以为空
            "iat" => time(), //签发时间
            "nbf" => '', //在什么时候jwt开始生效  （这里表示生成100秒后才生效）
            "exp" => time()+ (3600*24*60*60), //token 过期时间
            "user_id" => $user_id ,//记录的userid的信息，这里是自已添加上去的，如果有其它信息，可以再添加数组的键值对
            'token' => $token
        ];

        if ($type == 1){

            if ($user =  StaffModel::where('id', $user_id)->cache('user:info' . $user_id)->setField('token',$token)) {
                //$this->clear($user_id);
                return JWT::encode($jwt, $key);
            }
        }else{

            if ($user =  UserModel::where('id', $user_id)->cache('user:info' . $user_id)->setField('token',$token)) {
                //$this->clear($user_id);
                return JWT::encode($jwt, $key);
            }
        }


     /*   $jwt = JWT::encode($token,$key,"HS256"); //根据参数生成了 token*/
        return '';

    }

    /*产生token用于员工端*/  
    public function stafftoken($user_id)
    {
        $key = \Config::get('config.jwt.jwt_key');  //这里是自定义的一个随机字串，应该写在config文件中的，解密时也会用，相当    于加密中常用的 盐  salt


        $token   = sha1($user_id . uniqid());

        $jwt = [
            "iss"=>"",  //签发者 可以为空
            "aud"=>"", //面象的用户，可以为空
            "iat" => time(), //签发时间
            "nbf" => '', //在什么时候jwt开始生效  （这里表示生成100秒后才生效）
            "exp" => time()+ (3600*24*60*60), //token 过期时间
            "staff_id" => $user_id ,//记录的userid的信息，这里是自已添加上去的，如果有其它信息，可以再添加数组的键值对
            'token' => $token
        ];

        if ($user = StaffModel::where('id', $user_id)->cache('staff:info' . $user_id)->setField('token',$token)) {
            //$this->clear($user_id);
            return JWT::encode($jwt, $key);
        }

     /*   $jwt = JWT::encode($token,$key,"HS256"); //根据参数生成了 token*/
        return '';

    }    
    /**
     * @describe 检验Url,是否需要验证
     * @return bool
     * @time : 2019/10/22 - 14:27
     * @author : xxl
     */
    public function checkPublicUrl()
    {
        $urls = $this->config;
        $path = '/' . str_replace('.', '/', strtolower(Request::module() . '/' .Request::controller() . '/' . Request::action()));

        //判断是否需要验证
        foreach ($urls as $val) {
            foreach ($val as $value) {

                if ($path == $value) return true;
                if (strpos($path, $value)) return true;
                $position = strspn($path, $value);

                $str = substr($value, $position);
                if ($str == '*') return true;
            }

        }
        return false;
    }

    /**
     * @describe  获取用户信息
     * @param array $jwt
     * @return Passenger|array|\PDOStatement|string|\think\Model|null
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     * @time : 2019/10/25 - 11:14
     * @author : xxl
     */
    public function user($jwt = [])
    {
        if ($jwt){

            if (isset($jwt['user_id'])){

                $member = UserModel::where('id', $jwt['user_id'])->find();
                $this->member = $member;
                $this->user_id = $jwt['user_id'];
            }else{

                $member = StaffModel::where('id', $jwt['staff_id'])->find();
                $this->member = $member;
                $this->user_id = $jwt['staff_id'];
            }



        }
        return $this->member;
    }

    /**
     * @describe  清楚缓存
     * @param $user_id
     * @time : 2019/10/22 - 14:34
     * @author : xxl
     */
    public function clear($user_id)
    {
        cache('user:info' . ($user_id ? $user_id : $this->user_id), null);
    }

    /**
     * @describe  获取用户id
     * @return mixed
     * @time : 2019/10/22 - 14:34
     * @author : xxl
     */
    public function getUserId()
    {
        return $this->user_id;
    }
}